<?php

/**
 * Sunny软件公司欲开发一款飞机模拟系统，该系统主要模拟不同种类飞机的飞行特征与起飞特征，
 * 需要模拟的飞机种类及其特征如表24-1所示：表24-1 飞机种类及特征一览表
 *	飞机种类						起飞特征							飞行特征
 * 直升机(Helicopter)		垂直起飞(VerticalTakeOff)			亚音速飞行(SubSonicFly)
 * 
 * 客机(AirPlane)			长距离起飞(LongDistanceTakeOff)		亚音速飞行(SubSonicFly)
 * 
 * 歼击机(Fighter)			长距离起飞(LongDistanceTakeOff)		超音速飞行(SuperSonicFly)
 * 
 * 鹞式战斗机(Harrier)		垂直起飞(VerticalTakeOff)			超音速飞行(SuperSonicFly)
 * 
 * 为将来能够模拟更多种类的飞机，试采用策略模式设计该飞机模拟系统。
 */

interface Aircraft
{
	/**
	 * 起飞特征
	 */
	public function TakeOffFeature();
	
	/**
	 * 飞行特征
	 */
	public function FlightFeature();
}

/**
 * 直升机
 */
class Helicopter implements Aircraft
{

	public function TakeOffFeature() {
		echo '起飞特征：垂直起飞。<br/>';
	}
	
	public function FlightFeature() {
		echo '飞行特征：亚音速飞行。<br/>';
	}
}

/**
 * 客机
 */
class AirPlane implements Aircraft
{
	public function TakeOffFeature() {
		echo '起飞特征：长距离起飞。<br/>';
	}
	
	public function FlightFeature() {
		echo '飞行特征：亚音速飞行。<br/>';
	}
}

/**
 * 歼击机
 */
class Fighter implements Aircraft
{
	public function TakeOffFeature() {
		echo '起飞特征：长距离起飞。<br/>';
	}
	
	public function FlightFeature() {
		echo '飞行特征：超音速飞行。<br/>';
	}
}

/**
 * 鹞式战斗机
 */
class Harrier implements Aircraft
{
	public function TakeOffFeature() {
		echo '起飞特征：垂直起飞。<br/>';
	}
	
	public function FlightFeature() {
		echo '飞行特征：亚音速飞行。<br/>';
	}
}

/**
 * 飞机模拟系统
 */
class AircraftSimulationSystem
{
	private $_aircraft;
	
	public function setAircraft(Aircraft $aircraft) {
		$this->_aircraft = $aircraft;
	}
	
	public function test() {
		$this->_aircraft->TakeOffFeature();
		$this->_aircraft->FlightFeature();
	}
}

class Client
{
	public static function main() {
		$system = new AircraftSimulationSystem();
		
		echo '歼击机：<br/>';
		$aircraft = new Fighter();
		$system->setAircraft($aircraft);
		$system->test();
		
		echo '直升机：<br/>';
		$aircraft = new Helicopter();
		$system->setAircraft($aircraft);
		$system->test();
	}
}

Client::main();